import { Response } from 'express';
import jwt from 'jsonwebtoken';
import { findUserByUsername, findUserByEmail, createUser, validatePassword } from '../models/User';
import { AuthRequest } from '../middleware/auth';

// 用户注册
export const register = async (req: AuthRequest, res: Response): Promise<void> => {
  try {
    const { username, email, password } = req.body;
    
    // 验证输入
    if (!username || !email || !password) {
      res.status(400).json({
        success: false,
        message: '用户名、邮箱和密码都是必填项'
      });
      return;
    }
    
    // 检查用户名是否已存在
    const existingUserByUsername = await findUserByUsername(username);
    if (existingUserByUsername) {
      res.status(400).json({
        success: false,
        message: '用户名已存在'
      });
      return;
    }
    
    // 检查邮箱是否已存在
    const existingUserByEmail = await findUserByEmail(email);
    if (existingUserByEmail) {
      res.status(400).json({
        success: false,
        message: '邮箱已被注册'
      });
      return;
    }
    
    // 创建新用户
    const newUser = await createUser(username, email, password);
    
    // 生成JWT令牌
    const token = generateToken(newUser.id);
    
    // 返回用户信息（不包含密码）
    const { password: _, ...userWithoutPassword } = newUser;
    
    res.status(201).json({
      success: true,
      message: '注册成功',
      data: {
        user: userWithoutPassword,
        token
      }
    });
  } catch (error) {
    console.error('注册错误:', error);
    res.status(500).json({
      success: false,
      message: '注册失败，请稍后再试'
    });
  }
};

// 用户登录
export const login = async (req: AuthRequest, res: Response): Promise<void> => {
  try {
    const { email, password } = req.body;
    
    // 验证输入
    if (!email || !password) {
      res.status(400).json({
        success: false,
        message: '邮箱和密码都是必填项'
      });
      return;
    }
    
    // 查找用户
    const user = await findUserByEmail(email);
    if (!user) {
      res.status(401).json({
        success: false,
        message: '邮箱或密码错误'
      });
      return;
    }
    
    // 验证密码
    const isPasswordValid = await validatePassword(password, user.password);
    if (!isPasswordValid) {
      res.status(401).json({
        success: false,
        message: '邮箱或密码错误'
      });
      return;
    }
    
    // 生成JWT令牌
    const token = generateToken(user.id);
    
    // 返回用户信息（不包含密码）
    const { password: _, ...userWithoutPassword } = user;
    
    res.status(200).json({
      success: true,
      message: '登录成功',
      data: {
        user: userWithoutPassword,
        token
      }
    });
  } catch (error) {
    console.error('登录错误:', error);
    res.status(500).json({
      success: false,
      message: '登录失败，请稍后再试'
    });
  }
};

// 获取当前用户信息
export const getCurrentUser = async (req: AuthRequest, res: Response): Promise<void> => {
  try {
    // 用户信息已经通过认证中间件添加到请求对象中
    if (!req.user) {
      res.status(401).json({
        success: false,
        message: '未授权访问'
      });
      return;
    }
    
    res.status(200).json({
      success: true,
      data: {
        user: req.user
      }
    });
  } catch (error) {
    console.error('获取用户信息错误:', error);
    res.status(500).json({
      success: false,
      message: '获取用户信息失败'
    });
  }
};

// 生成JWT令牌的辅助函数
const generateToken = (userId: number): string => {
  const jwtSecret = process.env.JWT_SECRET;
  const jwtExpiresIn = process.env.JWT_EXPIRES_IN || '7d';
  
  if (!jwtSecret) {
    throw new Error('JWT_SECRET环境变量未设置');
  }
  
  return jwt.sign({ id: userId }, jwtSecret, { expiresIn: jwtExpiresIn });
};